﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI.WebControls;
using vudu.Presentacion.Contrato.VU_01_Gestionar_Salones;
using vudu.Logica.Fachada;
using vudu.ClasesDominio;
using System.Data;
using System.Text.RegularExpressions;

namespace vudu.Presentacion.Presentador.VU_01_Gestionar_Salones
{
    public class PresentadorConsultarSalon
    {
        //Declaracion de variables
        private EnlaceLogico _fachada;
        public IContratoConsultarSalon _vista;
        private List<Salon> _lista;
        private Universidad _universidad = new Universidad();
        public int opcion;
        //Columna del GridView perteneciente al codigo del salon
        public int columna = 4;
        private string busqueda;

        public PresentadorConsultarSalon(EnlaceLogico fachada,IContratoConsultarSalon vista)
        {
            //Inicializacion del EnlaceLogico,la vista y la universidad logeada en el constructor
            _universidad = (Universidad)fachada.RolActual;
            _vista = vista;
            _fachada = fachada;
            _vista.InfoUsuario.Text = _universidad.Nombre;
        }

        //Metodo que consulta los salones de una universidad
        public void ConsultarSalones()
        {
            //Se instancia una lista de salones
            List<Salon> listaSalones= new List<Salon>();
            //Esta variable cambia en la capa de datos dependiendo si la variable _busqueda es vacia o no
            opcion = 0;
            //Se llama a la Fachada Logica y se le pasa la opcion inicializada en 0,la busqueda del salon introducido
            //por el usuario y el id de la universidad
            listaSalones = _fachada.ConsultarSalon(opcion,busqueda,_universidad);   
            //Llena el GridView con los salones traidos desde la capa de datos
            llenarGridView(listaSalones);
            //Coloca invisible una columna del GridView
            ponerInvisibleColumnaCodigo(columna);
        }

        //Metodo que consulta los salones inabilitados
        public void ConsultarSalonesInabilitados(int condicion, int IdUniversidad)
        {
            List<Salon> listaSalones = new List<Salon>();
            _universidad.IdUniv = IdUniversidad;
            opcion = 0;
            listaSalones = _fachada.ConsultarSalon(opcion, busqueda, _universidad);
            llenarGridViewInabilitados(listaSalones,condicion);
            ponerInvisibleColumnaCodigo(columna);
        }

        //Metodo que llena el GridView de los salones Inabilitados
        public void llenarGridViewInabilitados(List<Salon> misSalones, int condicion)
        {
           
            if (misSalones.Count > 0)
            {
                DataTable tablaSalon = new DataTable();
                string estadoSalon = "";
                tablaSalon.Columns.Add("Nombre", typeof(string));
                tablaSalon.Columns.Add("Tipo", typeof(string));
                tablaSalon.Columns.Add("Capacidad", typeof(int));
                tablaSalon.Columns.Add("Edificio", typeof(string));
                tablaSalon.Columns.Add("Codigo", typeof(int));
                tablaSalon.Columns.Add("Status", typeof(string));

                for (int indiceSalon = 0; indiceSalon < misSalones.Count; indiceSalon++)
                {
                    if ((misSalones[indiceSalon].Status == 0) && (condicion == 0) )
                    {
                        estadoSalon = "Inabilitado";
                        tablaSalon.Rows.Add(misSalones[indiceSalon].Nombre, misSalones[indiceSalon].Tipo,
                                            misSalones[indiceSalon].Capacidad, misSalones[indiceSalon].Edificio,
                                            misSalones[indiceSalon].NumeroSalon, estadoSalon);
                    }
                    else
                    {
                        if ((misSalones[indiceSalon].Status == 1) && (condicion == 1))
                        {
                            estadoSalon = "Habilitado";
                            tablaSalon.Rows.Add(misSalones[indiceSalon].Nombre, misSalones[indiceSalon].Tipo,
                                            misSalones[indiceSalon].Capacidad, misSalones[indiceSalon].Edificio,
                                            misSalones[indiceSalon].NumeroSalon, estadoSalon);
                        }
                    }

                    
                }
                _vista.GridSalon.DataSource = tablaSalon;
                _vista.GridSalon.DataBind();
            }
            else
            {
                _vista.Error.Text = "Operacion Fallida: No hay registros bajo esa busqueda";
                _vista.Error.ForeColor = System.Drawing.Color.Red;
                _vista.Error.Visible = true;
            }
        }

        //Metodo que llena un GridView con salones 
        public void llenarGridView(List<Salon> misSalones) 
        {
            if (misSalones.Count > 0)
            {
                //Se instancia un objeto tipo DataTable
                DataTable tablaSalon = new DataTable();
                string estadoSalon = "";
                //Se construye las columnas de la DataTable
                tablaSalon.Columns.Add("Nombre", typeof(string));
                tablaSalon.Columns.Add("Tipo", typeof(string));
                tablaSalon.Columns.Add("Capacidad", typeof(int));
                tablaSalon.Columns.Add("Edificio", typeof(string));
                tablaSalon.Columns.Add("Codigo", typeof(int));
                tablaSalon.Columns.Add("Status", typeof(string));

                //Se recorre la lista de salones que se paso por la cabecera del metodo
                for (int indiceSalon = 0; indiceSalon < misSalones.Count; indiceSalon++)
                {
                    //Se verifica el status de cada salon
                    //Si el status es 0 el salon esta Inhabilitado
                    //Sino el salon esta Habilitado
                    if (misSalones[indiceSalon].Status == 0)
                        estadoSalon = "Inhabilitado";
                    else
                        estadoSalon = "Habilitado";
                    //Se a;ade el salon consultado de la lista a una fila del DataTable
                    tablaSalon.Rows.Add(misSalones[indiceSalon].Nombre, misSalones[indiceSalon].Tipo,
                                        misSalones[indiceSalon].Capacidad, misSalones[indiceSalon].Edificio,
                                        misSalones[indiceSalon].NumeroSalon, estadoSalon);
                }
                //Se asigna el contenido de la Datatable al GridView
                _vista.GridSalon.DataSource = tablaSalon;
                _vista.GridSalon.DataBind();
            }
            else
            {
                _vista.Error.Text = "Operacion Fallida: No hay registros bajo esa busqueda";
                _vista.Error.ForeColor = System.Drawing.Color.Red;
                _vista.Error.Visible = true;
            }
        }

        //Metodo que pone invisible una columna del GridView de Salones
        public void ponerInvisibleColumnaCodigo(int columna)
        {
            //Pone no visible la cabezera de esa columna
            _vista.GridSalon.HeaderRow.Cells[columna].Visible = false;
            //Recorre cada fila del gridView en la columna seleccionada para colocar invisible
            foreach (GridViewRow row in _vista.GridSalon.Rows)
            {
                row.Cells[columna].Visible = false;
            }
        }

        //Metodo que valida si el usuario busco un salon en mas detalle
        public void busquedaSalon()
        {       
            //Se valida que el campo de busqueda no acepte caracteres especiales
            Regex rx = new Regex(@"[. $ ^ { [ ( | ) * + ? \ % < > ]");
                //Si el textbox no esta vacio
                if (_vista.BuscarSalon.Text != "")
                {
                    //Se verifica si fue seleccionada una opcion en el RadioButtonList
                    if (_vista.Opcion.SelectedValue != "")
                    {
                        if (!rx.IsMatch(_vista.BuscarSalon.Text))
                        {
                            //Se le asigna a la variable opcion el value del RadioButtonList seleccionado
                            opcion = int.Parse(_vista.Opcion.SelectedValue);
                            //Se hace un switch para comprobar que opcion de busqueda selecciono el usuario
                            switch (opcion)
                            {
                                //Si se busco por nombre
                                case 1:
                                    _lista = _fachada.ConsultarSalon(opcion, _vista.BuscarSalon.Text, _universidad);
                                break;
                                //Si se busco por edificio
                                 case 2:
                                    _lista = _fachada.ConsultarSalon(opcion, _vista.BuscarSalon.Text, _universidad);
                                break;
                                 //Si se busco por tipo
                                case 3:
                                    _lista = _fachada.ConsultarSalon(opcion, _vista.BuscarSalon.Text, _universidad);
                                break;
                              }
                            //Se llana el gridView con la lista de salones consultados
                            llenarGridView(_lista);
                            //Se coloca invisible una columna del gridview
                            ponerInvisibleColumnaCodigo(columna);
                        }
                        else
                       {
                        _vista.Error.Text = "Operacion Fallida: error en campo de busqueda";
                        _vista.Error.ForeColor = System.Drawing.Color.Red;
                        _vista.Error.Visible = true;
                        }
                    }
                    else
                    {
                        //Sino fue seleccionado da un error
                        _vista.Error.Text = "Operacion Fallida: debe seleccionar una opcion de busqueda";
                        _vista.Error.ForeColor = System.Drawing.Color.Red;
                        _vista.Error.Visible = true;
                    }
                }
                else
                {
                    //Si no se hizo una busqueda particular se listan todos los salones
                    ConsultarSalones();
                }
            }
        }
}
